Me pregunto si hay una manera simple de obtener una línea de lectura "síncrona" o al menos obtener la apariencia de E / S síncrona en node.js
Yo uso algo como esto pero es bastante incómodo.
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false }); var i = 0; var s1 = ''; var s2 = ''; rl.on('line', function(line){ if(i==0) { s1 = line; } else if(i==1) { s2 = line; } i++; }) rl.on('close', function() { //do something with lines })'En lugar de esto, preferiría que fuera tan fácil como algo como
var s1 = getline(); // or "await getline()?" var s2 = getline(); // or "await getline()?"Condiciones útiles:
(a) Prefiero no usar módulos externos o el identificador de archivo /dev/stdio, estoy enviando código a un sitio web de envío de código y estos no funcionan allí
(b) Puede usar async/await o generadores
(c) Debe estar basado en líneas
(d) No debería requerir la lectura de la entrada estándar completa en la memoria antes del procesamiento
En caso de que alguien tropiece aquí en el futuro
Node11.7 agregó soporte para este doc_link usando async await await
const readline = require('readline'); //const fileStream = fs.createReadStream('input.txt'); const rl = readline.createInterface({ input: process.stdin, //or fileStream output: process.stdout }); for await (const line of rl) { console.log(line) } Recuerde envolverlo en la async function(){} , de lo contrario, obtendrá un error de palabra clave reservada .
const start = async () =>{ for await (const line of rl) { console.log(line) } } start() Para leer una línea individual, puede usar el iterador async manualmente
const it = rl[Symbol.asyncIterator](); const line1 = await it.next();Al igual que el módulo readline , hay otro módulo llamado readline-sync , que toma una entrada síncrona.
const reader = require("readline-sync"); //npm install readline-sync let username = reader.question("Username: "); const password = reader.question("Password: ",{ hideEchoBack: true }); if (username == "admin" && password == "foobar") { console.log("Welcome!") }Puedes simplemente envolverlo en una promesa -
const answer = await new Promise(resolve => { rl.question("What is your name? ", resolve) }) console.log(answer)